resolver (graphql)
特定のフィールドの値をどう取得するかを定義する関数
GraphQLでは下記2つが分離されていて、resolverは後者を表す
何を返すか (schema)
どう返すか (resolver)
resolverの引数
code:ts
(fieldParent, args, context, info) => { ... }
parent
親のフィールドの値
ネスト時に使う
args
クエリで指定された引数
context
Context (graphql)
info
AST など低レベル情報
普通はあまり使わない
例: User → posts の Resolver
schema
code:graphql(js)
type Query {
user(id: ID!): User
}
type User {
id: ID!
name: String!
posts: Post!!
}
type Post {
id: ID!
title: String!
}
resolver
code:ts
const resolvers = {
Query: {
user: async (_, { id }, { db }) => db.user.findById(id)
},
User: {
// parent は user object
posts: async (parent, _, { db }) => db.post.findMany({ userId: parent.id })
},
};
Query.user → db.user.findById
User.posts → 親の user.id を元に posts を取得
GraphQL はネストしても endpoint は 1 つ、resolver chaining により値が構築される
JavaScript で GraphQL サーバーの技術選定をする際の登場人物 - mizdra's blog
Code Firstなら、schemaとresolverを同時に書くことが多い
Schema Firstなら、GraphQL Codegenで生成した型に合わせてresolverを定義する
#WIP
N+1 問題
DataLoader (graphql)で対応する
GraphQLを扱う中で一番ダルいところと思ってたけど、
ただのrepositoryのようなもので、
普通にrestを書く時よりはだいぶ手間減ってるか
restのときは、同じfieldに対しても、複数のrepoisitoryを書くことも合ったわけで
graphqlの場合は、1対1でしかない
まあでも1対1だからこそ数が増えてダルいということはありうるか
mutationの場合は、restのrespoitoryとほぼほぼ同じか
trivial resolver
トリビアルリゾルバ
ここで出てきた
rootに追加されたresolverのこと
例
code:js
const resolvers = {
Query: { …… },
Mutation: { …… },
Photo: {
url: parent => http://yoursite.com/img/${parent.id}.jpg
}
}
これのPhotoの中のurlとかがtrivial resolver
https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/tutorial-combining-graphql-resolvers.html
https://www.graphql-tools.com/docs/resolvers/
https://qiita.com/NagaokaKenichi/items/86272f2f654070b06488